package com.cvpoc.service.impl;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

import com.cvpoc.service.JasperService;

public class JasperServiceImpl implements JasperService {

	private String filespath;
	private String jdbcurl;
	private String jdbcusername;
	private String jdbcpassword;
	private String jasperpath;
	private String jaspertemplate;
	private String jaspergeneratepdfpath;

	/**
	 * 
	 * Définir le chemin de jasper
	 * 
	 * @param jasperpath
	 * 
	 */

	public void setJasperpath(String jasperpath) {
		this.jasperpath = jasperpath;
	}

	/**
	 * 
	 * Définir le chemin des templates de type jrxml
	 * 
	 * @param jaspertemplate
	 * 
	 */

	public void setJaspertemplate(String jaspertemplate) {
		this.jaspertemplate = jaspertemplate;
	}

	/**
	 * 
	 * Définir le chemin de sorti des fichiers pdf
	 * 
	 * @param jaspergeneratepdfpath
	 * 
	 */

	public void setJaspergeneratepdfpath(String jaspergeneratepdfpath) {
		this.jaspergeneratepdfpath = jaspergeneratepdfpath;
	}

	/**
	 * 
	 * Récupération du chemin de la base de donnée.
	 * 
	 * @param databaseUrl
	 * 
	 */
	public void setJdbcurl(String jdbcurl) {
		this.jdbcurl = jdbcurl;
	}

	/**
	 * 
	 * Récupération du login
	 * 
	 * @param databaseLogin
	 * 
	 */
	public void setJdbcusername(String jdbcusername) {
		this.jdbcusername = jdbcusername;
	}

	/**
	 * 
	 * Récupération du login
	 * 
	 * @param databaseLogin
	 * 
	 */
	public void setJdbcpassword(String jdbcpassword) {
		this.jdbcpassword = jdbcpassword;
	}

	/**
	 * 
	 * Récupération du chemin contenant le fichier à traiter.
	 * 
	 * @param filespath
	 * 
	 */
	public void setFilespath(String filespath) {
		this.filespath = filespath;
	}

	/**
	 * 
	 * Génération d'un fichier de type pdf / excel / word en fonction
	 * 
	 * du nom de fichier entrant et du nom de fichier sortant.
	 * 
	 * @param fileIn
	 * @param fileOut
	 * @param fileFormat
	 * @return le nom nom et le chemin du fichier qui vient d'être généré
	 * @throws Exception
	 * 
	 */
	private String genererFichierFromDb(String fileIn, String fileOut,
			String fileFormat) throws Exception {
		String url = this.jdbcurl;
		String login = this.jdbcusername;
		String password = this.jdbcpassword;

		Connection connection = null;
		String returnedGeneratedFileFullName = null;

		try {
			Driver monDriver = new com.mysql.jdbc.Driver();
			DriverManager.registerDriver(monDriver);
			connection = DriverManager.getConnection(url, login, password);

			JasperDesign design = JRXmlLoader.load(this.filespath + jasperpath
					+ jaspertemplate + fileIn + ".jrxml");
			JasperReport report = JasperCompileManager.compileReport(design);
			Map<String, String> parameters = new HashMap<String, String>();

			JasperPrint print = JasperFillManager.fillReport(report,
					parameters, connection);

			if (fileFormat == "pdf") {
				String generatedFileFullName = this.filespath + jasperpath
						+ jaspergeneratepdfpath + fileOut + "." + fileFormat;
				JasperExportManager.exportReportToPdfFile(print,
						generatedFileFullName);
				returnedGeneratedFileFullName = generatedFileFullName;
			}
		} catch (JRException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return returnedGeneratedFileFullName;
	}

	/**
	 * 
	 * On génère un fichier de type pdf
	 * 
	 * @param fileIn
	 * @param fileOut
	 * @return
	 * 
	 */
	public String creerPdf(String fileIn, String fileOut) throws Exception {
		if (StringUtils.isBlank(fileOut)) {
			fileOut = fileIn;
		}
		return genererFichierFromDb(fileIn, fileOut, "pdf");
	}
}
